<?php
// ==========================================================
// 1. CONEXÃO DINÂMICA COMPATÍVEL COM PHPRAD E CONFIG.PHP
// ==========================================================
try {
    $pdo = null;
    if (isset($db) && $db instanceof PDO) {
        $pdo = $db;
    } elseif (isset($conn) && $conn instanceof PDO) {
        $pdo = $conn;
    } elseif (isset($this) && isset($this->conn) && $this->conn instanceof PDO) {
        $pdo = $this->conn;
    } else {
        // Mapeia até 4 níveis de profundidade para achar o config.php da raiz
        $caminhos_config = ['config.php', '../config.php', '../../config.php', '../../../config.php', '../../../../config.php', 'app/config.php'];
        foreach ($caminhos_config as $caminho) {
            if (file_exists($caminho)) {
                include_once($caminho);
                break;
            }
        }
        if (defined('DB_HOST') && defined('DB_NAME')) {
            $host     = DB_HOST;
            $dbname   = DB_NAME;
            $user     = defined('DB_USERNAME') ? DB_USERNAME : (defined('DB_USER') ? DB_USER : 'root');
            $password = defined('DB_PASSWORD') ? DB_PASSWORD : '';
            $port     = defined('DB_PORT') ? DB_PORT : '3306';
            
            $pdo = new PDO("mysql:host={$host};port={$port};dbname={$dbname};charset=utf8", $user, $password, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
            ]);
        }
    }

    if (!$pdo) {
        throw new Exception("Não foi possível estabelecer ligação com a base de dados.");
    }

    // ==========================================================
    // 2. CONTROLO DO PERFIL (ROLE) SELECIONADO (À PROVA DE FALHAS)
    // ==========================================================
    $perfis = $pdo->query("SELECT role_id, role_name FROM roles ORDER BY role_id ASC")->fetchAll();
    
    // Algoritmo robusto restaurado para capturar o ID do perfil selecionado em qualquer servidor ou rota
    $sel_role_id = null;
    if (isset($_GET['role_id'])) {
        $sel_role_id = (int)$_GET['role_id'];
    } elseif (isset($_POST['role_id'])) {
        $sel_role_id = (int)$_POST['role_id'];
    } elseif (isset($this->route->field_value)) {
        $sel_role_id = (int)$this->route->field_value;
    } else {
        // Varredura direta na URL para extrair o ID do perfil (ex: role_id/2)
        $request_uri = $_SERVER['REQUEST_URI'];
        if (preg_match('/role_id\/([0-9]+)/', $request_uri, $matches)) {
            $sel_role_id = (int)$matches[1];
        }
    }

    // Fallback padrão se nada for detetado
    if (empty($sel_role_id)) {
        $sel_role_id = $perfis[0]['role_id'] ?? null;
    }

    // Inicialização do nome da escola com consulta dinâmica
    $escola_nome = "Escola Adventista da Manga";
    $q_escola = $pdo->query("SELECT Nome_Escola FROM escola LIMIT 1")->fetch();
    if ($q_escola) {
        $escola_nome = $q_escola['Nome_Escola'];
    }

    // ==========================================================
    // 3. PROCESSAMENTO DO FORMULÁRIO (SALVAR ALTERAÇÕES COM FAIL-SAFE)
    // ==========================================================
    $msg_sucesso = null;
    $msg_erro = null;

    if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['btn_salvar'])) {
        $post_role_id = (int)$_POST['role_id'];
        
        try {
            $pdo->beginTransaction();

            // Apaga as permissões anteriores para o perfil selecionado
            $stmt_del = $pdo->prepare("DELETE FROM role_permissions WHERE role_id = :role_id");
            $stmt_del->execute(['role_id' => $post_role_id]);

            // GARANTIA DE SEGURANÇA (Fail-Safe):
            // Impede que o Administrador (1 ou 5) bloqueie o seu próprio acesso à página de gestão de permissões!
            if ($post_role_id == 1 || $post_role_id == 5) {
                if (!isset($_POST['perm']) || !is_array($_POST['perm'])) {
                    $_POST['perm'] = [];
                }
                $_POST['perm']['role_permissions']['list'] = '1';
                $_POST['perm']['role_permissions']['view'] = '1';
                $_POST['perm']['role_permissions']['add'] = '1';
                $_POST['perm']['role_permissions']['edit'] = '1';
                $_POST['perm']['role_permissions']['delete'] = '1';
                $_POST['perm']['role_permissions']['index'] = '1';
            }

            // Insere as novas opções selecionadas
            if (!empty($_POST['perm']) && is_array($_POST['perm'])) {
                $stmt_ins = $pdo->prepare("INSERT INTO role_permissions (role_id, page_name, action_name) VALUES (:role_id, :page, :action)");
                
                foreach ($_POST['perm'] as $page => $actions) {
                    foreach ($actions as $action => $value) {
                        if ($value == '1') {
                            $stmt_ins->execute([
                                'role_id' => $post_role_id,
                                'page' => $page,
                                'action' => $action
                            ]);
                        }
                    }
                }
            }

            $pdo->commit();
            
            // REDIRECIONAMENTO NATIVO: Utiliza a rota limpa de filtragem do PHPRad
            $redirect_url = "role_permissions/index/role_id/" . $post_role_id;
            if (defined('SITE_ADDR')) {
                $redirect_url = rtrim(SITE_ADDR, '/') . '/role_permissions/index/role_id/' . $post_role_id;
            } else {
                $redirect_url = 'index/role_id/' . $post_role_id;
            }
            
            // CORREÇÃO: Evita o erro "Cannot modify header information" usando JS como contingência
            if (!headers_sent()) {
                header("Location: " . $redirect_url);
            } else {
                echo "<script>window.location.href = '" . $redirect_url . "';</script>";
            }
            exit;

        } catch (Exception $ex) {
            $pdo->rollBack();
            $msg_erro = "Erro ao guardar permissões: " . $ex->getMessage();
        }
    }

    // ==========================================================
    // 4. ALGORITMO HÍBRIDO DE VARREDURA DINÂMICA DE PÁGINAS (NOVO)
    // ==========================================================
    $paginas_sistema = [];

    // Localiza a pasta física de forma absoluta e segura usando a rota do index.php da raiz (Sem double underscores)
    $partials_dir = str_replace('\\', '/', dirname($_SERVER['SCRIPT_FILENAME'])) . '/app/views/partials';

    if (is_dir($partials_dir)) {
        // Varredura via scandir (Livre de bugs de asterisco em sistemas Windows/MAMP)
        $files = scandir($partials_dir);
        if ($files !== false) {
            foreach ($files as $file) {
                if ($file === '.' || $file === '..') {
                    continue;
                }
                $full_path = $partials_dir . '/' . $file;
                if (is_dir($full_path)) {
                    // Filtra e ignora pastas estruturais de controle do PHPRad
                    $pastas_excluidas = ['errors', 'info', 'index', 'shared', 'custom', 'passwordmanager'];
                    if (in_array(strtolower($file), $pastas_excluidas)) {
                        continue;
                    }
                    
                    // Formata o nome da pasta para exibição amigável
                    $label = ucwords(str_replace('_', ' ', $file));
                    $paginas_sistema[$file] = $label;
                }
            }
        }
    }

    // Organiza todos os módulos encontrados por ordem alfabética
    asort($paginas_sistema);

    // Fallback de contingência caso os dois métodos de leitura física falhem
    if (empty($paginas_sistema)) {
        $paginas_sistema = [
            'aluno'             => 'Alunos',
            'ano_letivo'        => 'Anos Letivos',
            'classe'            => 'Classes',
            'classe_disciplina' => 'Disciplinas por Classe',
            'despesas'          => 'Despesas/Propinas',
            'disciplina'        => 'Disciplinas',
            'escola'            => 'Dados da Escola',
            'faltas'            => 'Faltas',
            'horario'           => 'Horarios',
            'inscricao'         => 'Inscricoes',
            'notas_trimestrais' => 'Notas Trimestrais',
            'pagamentos'        => 'Pagamentos',
            'paises'            => 'Paises',
            'professor'         => 'Professores',
            'resultados_anuais' => 'Resultados Anuais',
            'roles'             => 'Roles (Perfis)',
            'role_permissions'  => 'Role Permissions (Permissoes)',
            'salas'             => 'Salas de Aula',
            'staff'             => 'Funcionarios (Staff)',
            'turma'             => 'Turmas',
            'usuario'           => 'Utilizadores / Usuarios'
        ];
    }

    // ==========================================================
    // 5. CARREGAR PERMISSÕES ATUAIS DO PERFIL SELECIONADO
    // ==========================================================
    $permissoes_ativas = [];
    if ($sel_role_id) {
        $stmt_perms = $pdo->prepare("SELECT page_name, action_name FROM role_permissions WHERE role_id = :role_id");
        $stmt_perms->execute(['role_id' => $sel_role_id]);
        while ($row = $stmt_perms->fetch()) {
            $permissoes_ativas[$row['page_name']][$row['action_name']] = true;
        }
    }

    // ==========================================================
    // 6. RESOLUÇÃO DO ENDEREÇO DO LOGO.PNG (Sem double underscores)
    // ==========================================================
    $logo_url = 'assets/images/logo.png';
    if (defined('SITE_ADDR')) {
        $logo_url = rtrim(SITE_ADDR, '/') . '/assets/images/logo.png';
    } else {
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $host = $_SERVER['HTTP_HOST'];
        $subfolder = rtrim(str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'])), '/');
        $logo_url = $protocol . $host . $subfolder . '/assets/images/logo.png';
    }

    // ==========================================================
    // 7. PREPARAÇÃO DO REDIRECIONAMENTO JAVASCRIPT DO SELECT
    // ==========================================================
    $js_redirect_base = 'role_permissions/index/role_id/';
    if (defined('SITE_ADDR')) {
        $js_redirect_base = rtrim(SITE_ADDR, '/') . '/role_permissions/index/role_id/';
    }

} catch (Exception $e) {
    $msg_erro = "Erro de inicialização: " . $e->getMessage();
}
?>

<style>
    .matrix-card {
        background-color: #ffffff;
        border-radius: 12px;
        border: 1px solid #e2e8f0;
        box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.02);
        padding: 1.5rem;
    }
    .matrix-title {
        font-weight: 800;
        color: #0f172a;
        font-size: 1.4rem;
    }
    .form-control-custom {
        height: calc(2.25rem + 6px);
        font-weight: 600;
        border-radius: 8px;
        border-color: #cbd5e1;
        color: #0f172a;
    }
    .table-matrix {
        width: 100%;
        border-collapse: collapse;
        margin-top: 1rem;
    }
    .table-matrix th {
        background-color: #0f172a;
        color: #ffffff;
        text-align: center;
        font-size: 0.75rem;
        font-weight: 700;
        text-transform: uppercase;
        padding: 0.85rem;
        border: 1px solid #334155;
    }
    .table-matrix th.left, .table-matrix td.left {
        text-align: left !important;
    }
    .table-matrix td {
        padding: 0.75rem;
        border: 1px solid #e2e8f0;
        text-align: center;
        font-size: 0.85rem;
        vertical-align: middle !important;
    }
    .table-matrix tr:hover {
        background-color: #f8fafc;
    }
    .checkbox-custom {
        width: 1.15rem;
        height: 1.15rem;
        cursor: pointer;
        accent-color: #1e3a8a;
    }
    .btn-select-row {
        padding: 2px 8px;
        font-size: 0.65rem;
        font-weight: 700;
        border-radius: 4px;
        text-transform: uppercase;
    }
    .table-responsive {
        display: block;
        width: 100% !important;
        max-width: 100% !important;
        overflow-x: auto !important;
        -webkit-overflow-scrolling: touch;
        margin-bottom: 1.5rem;
        box-sizing: border-box;
    }
    /* Estilo dos Cartões de Ações Dinâmicas */
    .action-badge-card {
        background-color: #f8fafc;
        border: 1px solid #e2e8f0 !important;
        border-radius: 8px;
        padding: 6px 12px;
        margin-right: 8px;
        margin-bottom: 8px;
        display: inline-flex;
        align-items: center;
        min-width: 140px;
        transition: all 0.2s ease;
    }
    .action-badge-card:hover {
        background-color: #f1f5f9;
        border-color: #cbd5e1 !important;
    }
</style>

<div class="container-fluid">
    
    <?php if ($msg_erro): ?>
        <div class="alert alert-danger border-0 shadow-sm mb-4" style="border-radius: 8px;">
            <i class="fa fa-times-circle mr-2"></i> <?= htmlspecialchars($msg_erro) ?>
        </div>
    <?php endif; ?>

    <div class="matrix-card">
        
        <div class="d-flex justify-content-between align-items-center mb-4 pb-3 border-bottom">
            <div class="d-flex align-items-center">
                <!-- Logotipo do seu MAMP resolvido sem double underscores -->
                <img src="<?= htmlspecialchars($logo_url) ?>" alt="Logo" style="height: 48px; width: auto; margin-right: 1.25rem; object-fit: contain;">
                <div>
                    <span class="text-muted text-uppercase font-weight-bold" style="font-size: 0.75rem; letter-spacing: 0.05em;"><?= htmlspecialchars($escola_nome) ?></span>
                    <h2 class="matrix-title">Matriz de Permissões Dinâmicas</h2>
                </div>
            </div>
            <i class="fa fa-shield-alt text-primary" style="font-size: 1.8rem;"></i>
        </div>

        <!-- Seletor de Perfil -->
        <form method="GET" action="" id="form_perfil" class="mb-4">
            <div class="form-row align-items-center">
                <div class="col-md-6 mb-3 mb-md-0">
                    <label class="font-weight-bold text-muted small uppercase">Selecione o Perfil para configurar:</label>
                    <select name="role_id" class="form-control form-control-custom" onchange="window.location.href='<?php echo $js_redirect_base; ?>' + this.value;">
                        <?php foreach ($perfis as $perf): ?>
                            <option value="<?= $perf['role_id'] ?>" <?= ($perf['role_id'] == $sel_role_id) ? 'selected' : '' ?>>
                                <?= htmlspecialchars($perf['role_name']) ?>
                            </option>
                        <?php endforeach; ?>
                    </select>
                </div>
            </div>
        </form>

        <!-- Grelha de Ações por Página com Form Action Nativo e Seguro do PHPRad -->
        <form method="POST" action="role_permissions/index/role_id/<?php echo $sel_role_id; ?>">
            
            <!-- Inclusão do token CSRF nativo do PHPRad para autorização do POST -->
            <input type="hidden" name="csrf_token" value="<?php echo Csrf::$token; ?>" />
            <input type="hidden" name="role_id" value="<?= htmlspecialchars($sel_role_id) ?>">

            <div class="table-responsive">
                <table class="table-matrix">
                    <thead>
                        <tr>
                            <th class="left" style="width: 30%;">Página / Módulo</th>
                            <th class="left" style="width: 70%;">Ações e Páginas Internas Disponíveis</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($paginas_sistema as $page_db => $page_lbl): 
                            $pasta_actions = [];
                            $pasta_fisica = $partials_dir . '/' . $page_db;
                            
                            if (is_dir($pasta_fisica)) {
                                $scan_files = scandir($pasta_fisica);
                                if ($scan_files !== false) {
                                    foreach ($scan_files as $f_file) {
                                        if (pathinfo($f_file, PATHINFO_EXTENSION) === 'php') {
                                            $action_name = pathinfo($f_file, PATHINFO_FILENAME);
                                            
                                            $excluir_arquivos = ['index', 'ajax-list', 'ajax-pages', 'xml-list', 'pdf-list', 'ajax-page', 'view-header', 'view-footer'];
                                            if (in_array(strtolower($action_name), $excluir_arquivos)) {
                                                continue;
                                            }
                                            $pasta_actions[] = $action_name;
                                        }
                                    }
                                }
                            }
                            
                            if (empty($pasta_actions)) {
                                $pasta_actions = ['list', 'view', 'add', 'edit', 'delete'];
                            }
                            
                            sort($pasta_actions);
                        ?>
                            <tr id="row-<?= $page_db ?>">
                                <td class="left">
                                    <div class="font-weight-bold" style="color: #0f172a; font-size: 0.88rem;"><?= htmlspecialchars($page_lbl) ?></div>
                                    <small class="text-muted font-weight-bold" style="font-size: 0.70rem;">Rota: /<?= htmlspecialchars($page_db) ?></small>
                                    <div class="mt-2">
                                        <button type="button" class="btn btn-outline-secondary btn-select-row" onclick="toggleRow('row-<?= $page_db ?>')">Inverter Linha</button>
                                    </div>
                                </td>
                                <td class="left">
                                    <div class="d-flex flex-wrap align-items-center">
                                        <?php foreach ($pasta_actions as $act): 
                                            $checked = isset($permissoes_ativas[$page_db][$act]) ? 'checked' : '';
                                            
                                            $act_label = ucwords(str_replace('_', ' ', $act));
                                            if ($act === 'list') $act_label = 'Listar (list)';
                                            if ($act === 'view') $act_label = 'Ver (view)';
                                            if ($act === 'add') $act_label = 'Adicionar (add)';
                                            if ($act === 'edit') $act_label = 'Editar (edit)';
                                            if ($act === 'delete') $act_label = 'Excluir (delete)';
                                        ?>
                                            <div class="action-badge-card">
                                                <input type="checkbox" class="checkbox-custom mr-2" name="perm[<?= $page_db ?>][<?= $act ?>]" value="1" <?= $checked ?>>
                                                <span class="font-weight-bold" style="font-size: 0.76rem; color: #334155;"><?= htmlspecialchars($act_label) ?></span>
                                            </div>
                                        <?php endforeach; ?>
                                    </div>
                                </td>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>

            <div class="mt-4 pt-3 border-top d-flex justify-content-end">
                <button type="submit" name="btn_salvar" class="btn btn-primary" style="background-color: #1e3a8a; border: none; font-weight: 700; padding: 10px 24px; border-radius: 8px; font-size: 0.9rem;">
                    <i class="fa fa-save mr-2"></i>Guardar Permissões
                </button>
            </div>
        </form>

    </div>
</div>

<script>
function toggleRow(rowId) {
    const row = document.getElementById(rowId);
    if (row) {
        const checkboxes = row.querySelectorAll('.checkbox-custom');
        let peloMenosUmaMarcada = false;
        checkboxes.forEach(cb => {
            if (cb.checked) {
                peloMenosUmaMarcada = true;
            }
        });
        checkboxes.forEach(cb => {
            cb.checked = !peloMenosUmaMarcada;
        });
    }
}
</script>